home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1994 December / macformat-019.iso / Reader's Corner / Reader's Contibutions / MgM Collection / LeapYear1.5.1 ƒ / LeapYear1.5.1p < prev    next >
Encoding:
Text File  |  1994-05-09  |  7.9 KB  |  404 lines  |  [TEXT/PJMM]

  1. PROGRAM LeapYear1;
  2.  
  3. USES
  4.     sound;
  5. CONST
  6.     rLEAP = 128;
  7.     rABOUT = 129;
  8.     rBINARY = 130;
  9.     rABOUT2 = 131;
  10.  
  11.     iCALC = 1;
  12.     iINYEAR = 2;
  13.     iBCALC = 5;
  14.  
  15.     mAPPLE = 128;
  16.     mFILE = 129;
  17.  
  18.     sMOMMA = 128;
  19.     sYOUAINT = 129;
  20.     sHAHA = 130;
  21.     sWRETCHED = 131;
  22.  
  23. VAR
  24.     wpMAIN, wpBINARY, anyWINDOW: windowptr;
  25.     dpMAIN, dpBINARY: dialogptr;
  26.     myMENU: ARRAY[1..2] OF menuhandle;
  27.     myEVENT: eventrecord;
  28.     mask, item, x: integer;
  29.     endIT: boolean;
  30.     thechar: char;
  31.     BINstr: PACKED ARRAY[1..25] OF char;
  32.     err: oserr;
  33.  
  34. FUNCTION soundme (sndrsrc: integer): oserr;
  35.  
  36.     BEGIN
  37.         soundme := sndplay(NIL, getresource(soundListRsrc, sndrsrc), false);
  38.     END;
  39.  
  40. FUNCTION GetIRect (d: DialogPtr;
  41.                                 item: Integer): RectPtr;
  42.     VAR
  43.         iType: Integer;
  44.         iHdl: Handle;
  45.         itemrect: rect;
  46.  
  47.     BEGIN
  48.         GetDItem(d, item, iType, iHdl, itemRect);
  49.         GetIRect := @itemRect;
  50.     END;
  51.  
  52. PROCEDURE expand (dlog: dialogptr);
  53.     TYPE
  54.         Quadrant = (One, Two, Three, Four);
  55.     VAR
  56.  
  57.         Quarters: ARRAY[Quadrant] OF Rect;
  58.         quad: Quadrant;
  59.         tix: LongInt;
  60.         savePort: GrafPtr;
  61.         updRgn: RgnHandle;
  62.         hPos, hHalf, vHalf, iType, item: Integer;
  63.         r: Rect;
  64.         iHdl: Handle;
  65.         pic: PicHandle;
  66.         e: eventrecord;
  67.     CONST
  68.         SlideOffset = 3;
  69.  
  70.     BEGIN
  71.         GetPort(savePort);
  72.         SetPort(dlog);
  73.         WHILE NOT GetNextEvent(mDownMask, e) DO
  74.             ;
  75.         WHILE WaitMouseUp DO
  76.             ;
  77.         r := GetIRect(dlog, 1)^;
  78.         FOR quad := One TO Four DO
  79.             Quarters[quad] := r;
  80.         WITH r DO
  81.             BEGIN
  82.                 vHalf := (bottom + top) DIV 2;
  83.                 hHalf := (left + right) DIV 2;
  84.             END;
  85.  
  86.         Quarters[One].bottom := vHalf;
  87.         Quarters[One].left := hHalf;
  88.  
  89.         Quarters[Two].top := vHalf;
  90.         Quarters[Two].left := hHalf;
  91.  
  92.         Quarters[Three].top := vHalf;
  93.         Quarters[Three].right := hHalf;
  94.  
  95.         Quarters[Four].bottom := vHalf;
  96.         Quarters[Four].right := hHalf;
  97.  
  98.         updRgn := NewRgn;
  99.         hPos := vHalf;
  100.  
  101.         WHILE (hPos > 0) DO
  102.             BEGIN
  103.                 ObscureCursor;
  104.  
  105.                 hPos := hPos - SlideOffset;
  106.                 ScrollRect(Quarters[one], SlideOffset, -SlideOffset, updRgn);
  107.                 ScrollRect(Quarters[two], SlideOffset, SlideOffset, updRgn);
  108.                 ScrollRect(Quarters[three], -SlideOffset, SlideOffset, updRgn);
  109.                 ScrollRect(Quarters[four], -SlideOffset, -SlideOffset, updRgn);
  110.  
  111.                 Delay(1, tix);
  112.             END;
  113.  
  114.         DisposeRgn(updRgn);
  115.         DisposDialog(dlog);
  116.         ReleaseResource(Handle(pic));
  117.         SetPort(savePort);
  118.     END;
  119.  
  120. PROCEDURE integerof (thestring: STRING;
  121.                                 VAR thenumb: integer;
  122.                                 maxlen: integer);
  123.     VAR
  124.         i, L: integer;
  125.         digit: boolean;
  126.     BEGIN
  127.         thenumb := 0;
  128.         i := 0;
  129.         l := length(thestring);
  130.         IF L > maxlen THEN
  131.             BEGIN
  132.                 thenumb := -2;
  133.                 exit(integerof);
  134.             END;
  135.         REPEAT
  136.             i := i + 1;
  137.             digit := thestring[i] IN ['0'..'9'];
  138.             thenumb := 10 * thenumb + (ord(thestring[i]) - ord('0'));
  139.         UNTIL (i = l) OR NOT digit;
  140.         IF NOT digit THEN
  141.             thenumb := -1;
  142.     END;
  143.  
  144. FUNCTION leapyr (year: integer): boolean;
  145.     BEGIN
  146.         leapyr := (year MOD 4 = 0) AND (year MOD 100 <> 0) OR (year MOD 400 = 0);
  147.     END;
  148.  
  149. PROCEDURE calcLEAP;
  150.     VAR
  151.         YEAR: INTEGER;
  152.         thestr: str255;
  153.         itype, itypeb, itypec: integer;
  154.         it, itb, itc: handle;
  155.         box, boxb, boxc: rect;
  156.     BEGIN
  157.         getditem(dpMAIN, iINYEAR, itype, it, box);
  158.         getitext(it, thestr);
  159.         integerof(stringof(thestr), year, 4);
  160.         getditem(dpMAIN, 3, itypeb, itb, boxb);
  161.         getditem(dpMAIN, 6, itypec, itc, boxc);
  162.         CASE year OF
  163.             -1: 
  164.                 BEGIN
  165.                     setitext(itb, 'N/A');
  166.                     setitext(itc, 'Please try again.');
  167.                     err := soundme(sWRETCHED);
  168.                 END;
  169.             -2: 
  170.                 BEGIN
  171.                     setitext(itb, 'N/A');
  172.                     setitext(itc, 'Please try again.');
  173.                     err := soundme(sWRETCHED);
  174.                 END;
  175.             OTHERWISE
  176.                 BEGIN
  177.                     IF leapyr(year) THEN
  178.                         BEGIN
  179.                             setitext(itb, 'Leap year.');
  180.                             setitext(itc, '');
  181.                         END
  182.                     ELSE
  183.                         BEGIN
  184.                             setitext(itb, 'Not a Leap year.');
  185.                             setitext(itc, '');
  186.                         END;
  187.                 END;
  188.  
  189.         END;
  190.         drawdialog(dpMAIN);
  191.     END;
  192.  
  193. PROCEDURE writebinary (n: longint);
  194.     CONST
  195.         base = 2;
  196.     BEGIN
  197.  
  198.         IF n >= base THEN
  199.             writebinary(n DIV base);
  200.         BEGIN
  201.             x := x + 1;
  202.             binstr[x] := stringof(n MOD base : 1);
  203.  
  204.         END;
  205.     END;
  206.  
  207. PROCEDURE CalcBINARY;
  208.     VAR
  209.         BINARY: INTeger;
  210.         thestr, BINbSTR: str255;
  211.         itype, itypeb, itypec, y: integer;
  212.         it, itb, itc: handle;
  213.         box, boxb, boxc: rect;
  214.     BEGIN
  215.         x := 1;
  216.         FOR y := 1 TO 25 DO
  217.             BINstr[y] := ' ';
  218.         x := 0;
  219.         getditem(dpBINARY, iINYEAR, itype, it, box);
  220.         getitext(it, thestr);
  221.         getditem(dpBINARY, 6, itypeb, itb, boxb);
  222.         getditem(dpBINARY, 4, itypec, itc, boxc);
  223.         integerof(stringof(thestr), BINARY, 8);
  224.         CASE BINARY OF
  225.             -1: 
  226.                 BEGIN
  227.                     setitext(itb, 'N/A');
  228.                     setitext(itc, 'Please try again.');
  229.                     err := soundme(sWRETCHED);
  230.                 END;
  231.             -2: 
  232.                 BEGIN
  233.                     setitext(itb, 'N/A');
  234.                     setitext(itc, 'Please try again.');
  235.                     err := soundme(sWRETCHED);
  236.                 END;
  237.             OTHERWISE
  238.                 BEGIN
  239.                     writebinary(BINARY);
  240.                     BINbSTR := stringof(BINstr);
  241.                     setitext(itb, BINbSTR);
  242.                     setitext(itc, '');
  243.                 END;
  244.  
  245.         END;
  246.         drawdialog(dpBINARY);
  247.     END;
  248.  
  249. PROCEDURE DoAbout;
  250.     VAR
  251.         about: dialogptr;
  252.         e: eventrecord;
  253.     BEGIN
  254.         Hilitewindow(wpMain, false);
  255.  
  256.         about := GetNewDialog(rABOUT, NIL, Windowptr(-1));
  257.         drawdialog(about);
  258.         err := soundme(sYOUAINT);
  259.         expand(about);
  260.  
  261.         about := GetNewDialog(rABOUT2, NIL, Windowptr(-1));
  262.         drawdialog(about);
  263.         err := soundme(sMOMMA);
  264.         expand(about);
  265.  
  266.         Hilitewindow(wpMain, true);
  267.     END;
  268.  
  269. PROCEDURE DoMenu (mresult: longint);
  270.     VAR
  271.         theitem, themenu: integer;
  272.         name: str255;
  273.         temp: integer;
  274.     BEGIN
  275.         theitem := loword(mresult);
  276.         themenu := hiword(mresult);
  277.         CASE themenu OF
  278.             mAPPLE: 
  279.                 BEGIN
  280.                     IF theitem = 1 THEN
  281.                         DoAbout
  282.                     ELSE
  283.                         BEGIN
  284.                             getitem(myMENU[1], theitem, name);
  285.                             temp := opendeskacc(name);
  286.                             setport(dpMAIN);
  287.                         END;
  288.                 END;
  289.             mFILE: 
  290.                 BEGIN
  291.                     CASE theitem OF
  292.                         1: 
  293.                             BEGIN
  294.                                 Hilitewindow(wpMain, true);
  295.                                 bringtofront(dpMAIN);
  296.                                 showwindow(dpMain);
  297.                                 Hilitewindow(wpBINARY, false);
  298.  
  299.                             END;
  300.                         2: 
  301.                             BEGIN
  302.                                 Hilitewindow(wpBINARY, true);
  303.                                 bringtofront(dpBINARY);
  304.                                 showwindow(dpBINARY);
  305.                                 Hilitewindow(wpMain, false);
  306.                             END;
  307.                         4: 
  308.                             endit := true;
  309.                     END;
  310.                 END;
  311.         END;
  312.         hilitemenu(0);
  313.     END;
  314.  
  315. PROCEDURE SETMEUP;
  316.  
  317.     BEGIN
  318.         initcursor;
  319.         initmenus;
  320.         x := 0;
  321.  
  322.         myMENU[1] := getmenu(mAPPLE);
  323.         addresmenu(myMENU[1], 'DRVR');
  324.         insertmenu(myMENU[1], 0);
  325.         myMENU[2] := getmenu(mFILE);
  326.         insertmenu(myMENU[2], 0);
  327.         drawmenubar;
  328.  
  329.         dpBINARY := GetNewDialog(rBINARY, NIL, WindowPtr(-1));
  330.         wpBINARY := dpBINARY;
  331.         hidewindow(dpBINARY);
  332.         paramtext('', '', '', '');
  333.  
  334.         dpMAIN := GetNewDialog(rLEAP, NIL, WindowPtr(-1));
  335.         wpMAIN := dpMAIN;
  336.         paramtext('', '', '', '');
  337.         endIT := False;
  338.     END;
  339.  
  340. BEGIN
  341.     setmeup;
  342.     REPEAT
  343.         systemtask;
  344.         IF getnextevent(-1, myEVENT) OR isdialogevent(myEVENT) THEN
  345.             BEGIN
  346.                 mask := findwindow(myEVENT.where, anyWINDOW);
  347.                 CASE myEVENT.what OF
  348.                     1: 
  349.                         BEGIN
  350.                             CASE mask OF
  351.                                 indrag: 
  352.                                     BEGIN
  353.                                         IF anywindow <> frontwindow THEN
  354.                                             selectwindow(anyWINDOW);
  355.                                         dragwindow(anyWINDOW, myEVENT.where, screenbits.bounds);
  356.                                     END;
  357.                                 incontent: 
  358.                                     BEGIN
  359.                                         IF anywindow <> frontwindow THEN
  360.                                             selectwindow(anyWINDOW);
  361.                                     END;
  362.                                 indesk: 
  363.                                     Hilitewindow(wpMain, false);
  364.                                 insyswindow: 
  365.                                     systemclick(myEVENT, anyWINDOW);
  366.                                 inmenubar: 
  367.                                     DoMenu(menuselect(myEVENT.where));
  368.                                 ingoaway: 
  369.                                     BEGIN
  370.                                         IF TrackGoAway(anyWINDOW, myEVENT.where) THEN
  371.                                             hidewindow(anywindow);
  372.                                     END;
  373.                             END;
  374.                         END;
  375.                     activateevt: 
  376.                         BEGIN
  377.                             IF bitand(myEVENT.modifiers, activeflag) <> 0 THEN
  378.                             ELSE
  379.                         END;
  380.                     keydown, autokey: 
  381.                         BEGIN
  382.                             thechar := chr(bitand(myEVENT.message, charcodemask));
  383.                             IF bitand(myEVENT.modifiers, cmdkey) <> 0 THEN
  384.                                 domenu(menukey(thechar));
  385.                         END;
  386.                 END;
  387.                 IF dialogselect(myEVENT, anyWINDOW, item) THEN
  388.                     IF anyWINDOW = dpMAIN THEN
  389.                         BEGIN
  390.                             IF item = iCALC THEN
  391.                                 calcLEAP;
  392.                         END
  393.                     ELSE IF anyWINDOW = dpBINARY THEN
  394.                         BEGIN
  395.                             IF item = iBCALC THEN
  396.                                 calcBINARY;
  397.                         END;
  398.             END;
  399.  
  400.     UNTIL endIT;
  401.     closedialog(dpMAIN);
  402.     closedialog(dpBINARY);
  403.     err := soundme(sHAHA);
  404. END.